package org.smart4j.aop.proxy.jdkdynamicproxy.client;

import org.smart4j.aop.proxy.jdkdynamicproxy.service.Hello;
import org.smart4j.aop.proxy.jdkdynamicproxy.service.impl.HelloImpl;
import org.smart4j.aop.proxy.jdkdynamicproxy.proxy.DynamicProxy;


import java.lang.reflect.Proxy;

/**
 * 通过DynamicProxy 类去包装HelloImpl实例，然后在调用JDK 提供的
 * Proxy类的工厂方法newProxyInstance去动态创建一个Hello 接口的代理类，
 * 最后调用代理类的say方法。
 * Created by lyc on 2016-04-04.
 */
public class HelloJDKDynamicProxyMain {
    public static void main(String[] args){
        HelloImpl hello=new HelloImpl();
        DynamicProxy dynamicProxy=new DynamicProxy(hello);
        Hello helloProxy=(Hello) Proxy.newProxyInstance(
                hello.getClass().getClassLoader(),//ClassLoader 类加载器
                hello.getClass().getInterfaces(), //实现类的所有接口
                dynamicProxy                      //动态对代理对象
        );
        helloProxy.say("Even521 use dynamicProxy");
        /**
         * 注意：Proxy.newProxyInstance方法的参数实在让人"醉了"
         * 想办法重构一下 DynamicProxy.getProxy()
         * 重构后实现
         */
        DynamicProxy dynamicProxy1=new DynamicProxy(new HelloImpl());
        //只能动态代理有接口的类
        Hello helloProxy1=dynamicProxy1.getProxy();
        helloProxy1.say("Even521 use Refactor dynamicProxy ");

    }
}
